#!/usr/bin/env python3
"""
测试运行脚本
提供便捷的测试执行方式
"""
import os
import sys
import argparse
import subprocess
from datetime import datetime
from config.test_config import TestConfig


def run_command(command):
    """执行命令并返回结果"""
    try:
        result = subprocess.run(command, shell=True, capture_output=True, text=True)
        return result.returncode, result.stdout, result.stderr
    except Exception as e:
        print(f"执行命令失败: {str(e)}")
        return -1, "", str(e)


def run_tests(markers=None, browser=None, headless=False, parallel=False, report_type="html"):
    """
    运行测试
    
    Args:
        markers (str): 测试标记
        browser (str): 浏览器类型
        headless (bool): 是否无头模式
        parallel (bool): 是否并行执行
        report_type (str): 报告类型
    """
    # 构建pytest命令
    cmd = ["pytest"]
    
    # 添加标记
    if markers:
        cmd.extend(["-m", markers])
    
    # 添加浏览器参数
    if browser:
        cmd.extend(["--browser", browser])
    
    # 添加无头模式
    if headless:
        cmd.append("--headless")
    
    # 添加并行执行
    if parallel:
        cmd.extend(["-n", "auto"])
    
    # 添加报告类型
    if report_type == "html":
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        report_file = f"reports/report_{timestamp}.html"
        cmd.extend(["--html", report_file, "--self-contained-html"])
    elif report_type == "allure":
        cmd.extend(["--alluredir", "reports/allure-results"])
    
    # 添加详细输出
    cmd.append("-v")
    
    # 执行测试
    print(f"执行命令: {' '.join(cmd)}")
    returncode, stdout, stderr = run_command(" ".join(cmd))
    
    # 输出结果
    if stdout:
        print("标准输出:")
        print(stdout)
    
    if stderr:
        print("错误输出:")
        print(stderr)
    
    # 返回结果
    return returncode


def run_smoke_tests():
    """运行冒烟测试"""
    print("运行冒烟测试...")
    return run_tests(markers="smoke")


def run_regression_tests():
    """运行回归测试"""
    print("运行回归测试...")
    return run_tests(markers="regression")


def run_ui_tests():
    """运行UI测试"""
    print("运行UI测试...")
    return run_tests(markers="ui")


def run_specific_test(test_path):
    """运行指定测试"""
    print(f"运行指定测试: {test_path}")
    cmd = f"pytest {test_path} -v"
    returncode, stdout, stderr = run_command(cmd)
    
    if stdout:
        print("标准输出:")
        print(stdout)
    
    if stderr:
        print("错误输出:")
        print(stderr)
    
    return returncode


def generate_report(report_type="html"):
    """生成测试报告"""
    if report_type == "allure":
        print("生成Allure报告...")
        cmd = "allure serve reports/allure-results"
        returncode, stdout, stderr = run_command(cmd)
        
        if stdout:
            print("标准输出:")
            print(stdout)
        
        if stderr:
            print("错误输出:")
            print(stderr)
        
        return returncode
    else:
        print("HTML报告已在测试运行时生成")
        return 0


def main():
    """主函数"""
    parser = argparse.ArgumentParser(description="Web自动化测试运行器")
    
    # 添加命令行参数
    parser.add_argument("--smoke", action="store_true", help="运行冒烟测试")
    parser.add_argument("--regression", action="store_true", help="运行回归测试")
    parser.add_argument("--ui", action="store_true", help="运行UI测试")
    parser.add_argument("--test", type=str, help="运行指定测试文件或方法")
    parser.add_argument("--browser", type=str, choices=["chrome", "firefox", "edge"], 
                       help="指定浏览器类型")
    parser.add_argument("--headless", action="store_true", help="无头模式运行")
    parser.add_argument("--parallel", action="store_true", help="并行执行测试")
    parser.add_argument("--report", type=str, choices=["html", "allure"], default="html",
                       help="报告类型")
    parser.add_argument("--generate-report", action="store_true", help="生成测试报告")
    
    args = parser.parse_args()
    
    # 确保目录存在
    os.makedirs("reports", exist_ok=True)
    os.makedirs("logs", exist_ok=True)
    os.makedirs("testdata", exist_ok=True)
    
    # 根据参数执行相应操作
    if args.generate_report:
        return generate_report(args.report)
    elif args.smoke:
        return run_smoke_tests()
    elif args.regression:
        return run_regression_tests()
    elif args.ui:
        return run_ui_tests()
    elif args.test:
        return run_specific_test(args.test)
    else:
        # 默认运行所有测试
        print("运行所有测试...")
        return run_tests(browser=args.browser, headless=args.headless, 
                        parallel=args.parallel, report_type=args.report)


if __name__ == "__main__":
    exit_code = main()
    sys.exit(exit_code) 